'''
Created on 20/06/2013

@author: cristian
'''
from flask.globals import request
from pm import app
from pm.database import db
from pm.models.Fases import Fases
from pm.models.Items import Items
from pm.models.Proyectos import Proyectos
from pm.models.Relaciones import Relaciones
from pm.views import ensureParams
import matplotlib.pyplot as plt
import networkx as nx
import os
import random
import StringIO
from flask.helpers import send_file
direccion_actual = os.path.dirname(os.path.abspath(__file__))


@app.route('/grafosproyecto/creargrafoproyecto', methods=['GET', 'POST']) 
def crearGrafoProyecto():
    '''
    Metodo que crea un grafo
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_proyecto']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    
    try:
        id_proyecto = params['id_proyecto']
        proyecto = Proyectos.query.filter(Proyectos.id_proyecto == id_proyecto).one()
        fases = Fases.query.filter(Fases.id_proyecto == id_proyecto).all()
        
        G = nx.DiGraph(weighted=False)
        G.posicion = {}
        G.poslabels = {}
        G.labels = {}
        G.colores = {}
        G.posComp = {}
        G.complej = {}
        posx = 0
        fases.sort(key=lambda x: x.posicion)
        for fase in fases:
            y = 600
            itemFase = Items.query.filter(Items.id_fase == fase.id_fase).all()
            itemFase.sort(key=lambda x: x.id_item)
            for item in itemFase:
                if item.estado!=6:
                       
                    G.add_node(item.id_item)
                    y = y - 3
                    x = posx + 0.35
                    G.posicion[item.id_item] = (x, y)
                    G.colores[item.id_item] = 'coral'
                    G.poslabels[item.id_item] = (x, y + 0.8) 
                    G.labels[item.id_item] = item.nombre
                    G.posComp[item.id_item] = (x + 2.5, y)
                    G.complej[item.id_item] = 'Comp:' + str(item.complejidad)
            posx = posx + 10
        
       
        for fase in fases:
            itemFase = Items.query.filter(Items.id_fase == fase.id_fase).all()
            for item in itemFase:
                itemPadre = Relaciones.query.filter(Relaciones.id_destino == item.id_item)
                for ip in itemPadre:
                    if (ip.tipo == 1 and ip.activo == True):
                        itemPadre = Items.query.filter(Items.id_item == ip.id_origen).one()
                        G.add_edge(itemPadre.id_item, item.id_item)
                        
                itemAntecesor = Relaciones.query.filter(Relaciones.id_destino == item.id_item)
                for ia in itemAntecesor:
                    if (ia.tipo == 2 and ia.activo == True):
                        itemAntecesor = Items.query.filter(Items.id_item == ia.id_origen).one()
                        G.add_edge(itemAntecesor.id_item, item.id_item)            
        plt.clf()
        nx.draw(G, G.posicion, node_color=[G.colores[v] for v in G], node_size=600)
        nx.draw_networkx_labels(G, G.poslabels, G.labels, fontsize=8)
        nx.draw_networkx_labels(G, G.posComp, G.complej, fontsize=8)

        strIO = StringIO.StringIO()
        plt.savefig(strIO, format='pdf')
        strIO.seek(0)

        return send_file(strIO,
                     attachment_filename="grafos.pdf",
                     as_attachment=False)
    except Exception, e:
        response = {"success" : False , "msg" : "Ups!! No se creo el Grafo del Proyecto..." + str(e)}
        return response
